package com.shujia.common_util.four;


import org.junit.Test;

/*
String类：代表字符串。Java 程序中的所有字符串字面值（如 "abc" ）都作为此类的实例实现。
String是一个final类，代表不可变的字符序列。
字符串是常量，用双引号引起来表示。它们的值在创建之后不能更改。
String对象的字符内容是存储在一个字符数组value[]中的。

 */
public class StingDemo /*extends String*/ {

    @Test
    public void test5() {
        final int[] arr = {1, 2, 3};
        // arr = new int[2];
        // arr[1] = 22;
    }

    @Test
    public void test4() {
        Person p1 = new Person();
        p1.name = "Tom";

        Person p2 = new Person();
        p2.name = "Tom";

        System.out.println(p1.name.equals(p2.name));
        System.out.println(p1.name == p2.name);
        System.out.println(p1.name == "Tom");

        String s1 = new String("bcde");

        String s2 = new String("bcde");
        System.out.println(s1 == s2);


    }

    @Test
    public void test3() {
        String s1 = "javaEE";
        String s2 = "javaEE";
        String s3 = new String("javaEE");
        String s4 = new String("javaEE");
        System.out.println(s1 == s2);
        System.out.println(s1 == s3);
        System.out.println(s1 == s4);
        System.out.println(s3 == s4);

    }

    @Test
    public void test2() {
        // 直接指向字符串常量池
        String s1 = "abc";
        // 指向堆内存的地址值, 在堆内存再次指向字符串常量池
        String s2 = new String("abc");
        System.out.println(System.identityHashCode(s1));
        System.out.println(System.identityHashCode(s2));
    }

    @Test
    public void test1() {
        String s1 = "abc";
        String s2 = "abc";
        String s3 = "hello";
        String s4 = "hello";
        System.out.println(System.identityHashCode(s1));
        System.out.println(System.identityHashCode(s2));
        System.out.println(System.identityHashCode(s3));
        System.out.println(System.identityHashCode(s4));

    }

    public static void main(String[] args) {
//        final int i = 1;
//        i = 2;

//        final int[] arr = {1, 2, 3};
//        arr[1] = 4;
//        arr = new int[2];
        /*
        final 修饰的引用数据类型, 只能够保证地址值不能改变
         */
        String s1 = "abc";
        System.out.println(s1);
        System.out.println(System.identityHashCode(s1));

        // 报错了, 说明赋值操作改变了s1内存地址值
        s1 = "defghi";
        System.out.println(s1);
        System.out.println(System.identityHashCode(s1));

        // 字符串值的变化, 通过修改内存地址值来实现, 和String是不可变类概念是不冲突的


    }
}
